package main

import "fmt"

// 给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

// 由于在某些语言中不能改变数组的长度，所以必须将结果放在数组nums的第一部分。更规范地说，如果在删除重复项之后有 k 个元素，那么 nums 的前 k 个元素应该保存最终结果。

// 将最终结果插入 nums 的前 k 个位置后返回 k 。

// 不要使用额外的空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

// 自己的解法
// 思路：
// -1 题目已经说明，nums是个升序数组，就是已经排序 -> 数组中相同元素就是连续的
// -2 由于相同元素是连续的，那么只用保留第一个扫描到的元素就好了，
// 我用的是GO语言的特性来截取, append 在一个切片capacity 充足的情况下,是不会再分配内存的,
// 在这里是减少元素,所以长度只会变短,由此,是满足 题目空间复杂度的,并没有分配新的数据空间
func removeDuplicates(nums []int)int {
	fmt.Printf("1 %p %d\n",nums, cap(nums))

	for i := 0; i < len(nums)-1; i++ {
        j := i+1
        for  ; j < len(nums); j++ {
            if nums[i] != nums[j] {
                break
            }
        }
        nums = append(nums[:i+1], nums[j:]...)
    }
	fmt.Printf("2 %p %d\n",nums, cap(nums))
    return len(nums)
}

// 官方解法
// 不同之处: 其使用的是快慢指针的思想
func removeDuplicates2(nums []int)int {
	n := len(nums)
	if n == 0 {
		return 0
	}
	slow := 1
	for fast := 1 ; fast < n; fast++ {
		if nums[fast] != nums[fast -1] {
			nums[slow] = nums[fast]
			slow++
		}
	}
    return slow
}